function [y, H, x] = generate_mimo_system(Nt, Nr, SNR)
    % 生成MIMO信道矩阵 (复高斯分布)
    H = (randn(Nr, Nt) + 1j*randn(Nr, Nt))/sqrt(2);
    
    % 生成QPSK调制信号
    symbols = [-1-1j, -1+1j, 1-1j, 1+1j]'/sqrt(2); % 将符号集转为列向量
    symbol_indices = randi(4, Nt, 1);  % 生成Nt×1的符号索引
    x = zeros(Nt, 1);                  % 预分配发送信号向量
    for i = 1:Nt
        x(i) = symbols(symbol_indices(i));
    end
    
    % 打印维度信息进行调试
    fprintf('H size: [%d, %d]\n', size(H));
    fprintf('x size: [%d, %d]\n', size(x));
    
    % 添加噪声
    noise_var = 10^(-SNR/10);  % 根据SNR计算噪声方差
    noise = sqrt(noise_var/2)*(randn(Nr,1) + 1j*randn(Nr,1));
    
    fprintf('noise size: [%d, %d]\n', size(noise));
    
    % 检查x是否是列向量
    if ~isvector(x) || size(x,2) ~= 1
        error('x必须是Nt×1的列向量');
    end
    
    % 检查维度匹配
    if size(H,2) ~= size(x,1)
        error('H的列数必须等于x的行数. H: %dx%d, x: %dx%d', ...
            size(H,1), size(H,2), size(x,1), size(x,2));
    end
    
    % 接收信号
    y = H*x + noise;
    
    fprintf('y size: [%d, %d]\n', size(y));
    
    % 验证维度
    assert(size(H,1) == Nr && size(H,2) == Nt, 'H维度错误');
    assert(size(x,1) == Nt && size(x,2) == 1, 'x维度错误');
    assert(size(noise,1) == Nr && size(noise,2) == 1, 'noise维度错误');
    assert(size(y,1) == Nr && size(y,2) == 1, 'y维度错误');
end 